/**
 * @本文介绍了自动化配置路由
 * @扁平路由转换成树形
 * @像nuxt一样自动的配置
 */

/**
 * @api
 * @requires.context("路径","是否递归","正则表达式") 一次导入很多模块哦
 * 
 * 
 *
 */
// require.context 是 Webpack 提供的一个 API，用于在模块化开发中自动化导入符合特定规则的模块。
// 具体来说，require.context 可以接收三个参数：

// 一个需要被搜索的目录；
// 一个布尔值，表示是否还搜索该目录的子目录；
// 一个正则表达式，用于匹配文件名。

//通过此方法webpack  查出路径
let paths = require.context("@/pages/home", true, /\.vue$/);

//此路径会返回,通过keys()这个方式
let repeat = paths.keys().map(path => {
    //获取路径对应的每一个组件
    let currentComponent = paths(path).default;
    let { meta, name, redirect } = currentComponent;
    //通过正则去掉index.vue 或者去掉.vue的后缀
    let regExp = /(\/index\.vue|\.vue)$/
    let result = path.substring(1).replace(regExp, "");
    // console.log("@/pages/home"+res);
    //最终返回结果
    return {
        path: result ? result : "",
        //重定向 name属性  || 路由元信息
        meta:meta??{},
        name:name ?? result.split("/").join(""),
        redirect:redirect ?? null,
        component: () => import("@/pages/home" + result)
    }
});


//定义函数
//定义空数组
//遍历返回的数组
//去掉第一个/  or 转成一个数组
//length为一的都是根节点(id) 
//不是根节点如何拿到父节点
//这边需要浅拷贝一下返回的数据
//干掉自己就是pop();
//let pid

function toTree(repeat) {
    repeat = [...repeat];
    let treeRoutes = [];
    repeat.map(item => {
        let result = item.path.substring(1).split("/");
        //添加id
        item.id = result.join("-");
        if (result.length > 1) {
            let pathArr = [...result];
            pathArr.pop();
            //添加pid
            item.pid = pathArr.join("-")
        }
    });
    //扁平转树形
    repeat.forEach((item) => {
        item.path = item.path.toLowerCase();
        let parent = repeat.find(vitem => item.pid === vitem.id);
        if (parent) {
            if (!parent.children) {
                parent.children = []
            }
            item.path = item.path.substring(1).split('/').pop()
            parent.children.push(item)
        } else {
            if (item.path) {
                item.path = item.path.substring(1).split('/').pop()
                treeRoutes.push(item)
            }

        }
    })
    return treeRoutes;

}
export default [...toTree(repeat)]